package fr.upmc.alasca.centreCalcul.interne.machinePhysique.machineVirtuelle.interfaces;

import fr.upmc.alasca.centreCalcul.objets.Requete;
import fr.upmc.components.interfaces.OfferedI;
import fr.upmc.components.interfaces.RequiredI;


/**
 * @author Antoine Lavaire, Sabri Labassi, Thibaut Fleury, Ryme Fantazi
 */
public	interface	MachineVirtuelleCoeurI
extends				OfferedI, RequiredI
{
	
	/**
	 * Méthode appelée par un coeur pour signaler la fin de l'exécution de sa 
	 * requête et autoriser la Machine Virtuelle à envoyer une nouvelle requete 
	 * vers le coeur disponible.
	 * 
	 * @param uriCoeur Identifiant du coeur appelant
	 * @param idRequete Identifiant de la requête qui a fini d'être exécutée
	 * @param tempsExecution Temps d'exécution de la requête sur le coeur
	 * @param coeurDisponible Indique si la MV peut envoyer une nouvelle requête
	 * sur le coeur appelant (si non, alors le coeur n'est plus attaché à la 
	 * Machine Virtuelle)
	 * @throws Exception
	 */
	public	void	finExecutionRequete
	(
			String	uriCoeur,
			Requete requete,
			long	tempsExecution,
			boolean	coeurDisponible
	) throws	Exception;
	
	
	/**
	 * Permet d'attacher un nouveau coeur à une Machine Virtuelle.
	 * 
	 * @param uriCoeur Identifiant du coeur appelant
	 * @throws Exception
	 */
	public	void	attributionNouveauCoeur
	(
			String	uriCoeur
	) throws	Exception;
	
	
	/**
	 * Permet d'indiquer à une Machine Virtuelle qu'un coeur lui est retiré
	 * 
	 * @param uriCoeur Identifiant du coeur retiré
	 * @throws Exception
	 */
	public	void	retraitCoeur
	(
			String	uriCoeur
	) throws	Exception;
}
